﻿using System;
using System.ComponentModel;
using System.Resources;
using System.Text;

namespace Kyoh.Lib.Component.Globalization
{
    /// <summary><see cref="Encoding"/> 型のプロパティにデフォルト値を設定する <see cref="Attribute"/> を実装します。</summary>
    public class DefaultEncodingValueAttribute : DefaultValueAttribute
    {
        /// <summary><see cref="DefaultEncodingValueAttribute "/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="resourceType"><see cref="Encoding"/> 、またはコードページ名を格納したリソースの型。</param>
        /// <param name="resourceName"><see cref="Encoding"/> 、またはコードページ名のリソースの名前。</param>
        public DefaultEncodingValueAttribute(Type resourceType, string resourceName)
            : base(null)
        {
            ResourceManager manager = new ResourceManager(resourceType);
            object resource = manager.GetObject(resourceName);
            if (resource is Encoding)
                this.DefaultEncoding = (Encoding)resource;
            else if (resource is string)
                this.SetEncodingName((string)resource);
            else
                throw new InvalidOperationException();
        }

        /// <summary><see cref="DefaultEncodingValueAttribute "/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="encodingName">コードページ名。</param>
        public DefaultEncodingValueAttribute(string encodingName)
            : base(null)
        {
            this.SetEncodingName(encodingName);
        }
        /// <summary><see cref="DefaultEncodingValueAttribute "/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="codePage">コードページID。</param>
        public DefaultEncodingValueAttribute(int codePage)
            : base(null)
        {
            this.DefaultEncoding = Encoding.GetEncoding(codePage);
        }

        private void SetEncodingName(string encodingName)
        {
            if (encodingName == null)
                this.DefaultEncoding = null;
            else if (encodingName == "Default")
                this.DefaultEncoding = Encoding.Default;
            else
                this.DefaultEncoding = Encoding.GetEncoding(encodingName);
        }

        /// <summary>指定されたデフォルト値を取得します。</summary>
        public Encoding DefaultEncoding { get; private set; }

        /// <summary>デフォルト値を取得・設定します。</summary>
        public override object Value { get { return this.DefaultEncoding; } }
    }
}
